home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / fractal / frasr182 / mpmath.h < prev    next >
C/C++ Source or Header  |  1993-02-22  |  8KB  |  228 lines

  1. /*
  2.  *  REMOVED FORMAL PARAMETERS FROM FUNCTION DEFINITIONS (1/4/92)
  3.  */
  4.  
  5.  
  6. #ifndef MPMATH_H
  7. #define MPMATH_H
  8.  
  9. #ifndef _CMPLX_DEFINED
  10. #define _CMPLX_DEFINED
  11.  
  12. struct DHyperComplex {
  13.     double x,y;
  14.     double z,t;  
  15. };
  16.  
  17. struct LHyperComplex {
  18.     long x,y;
  19.     long z,t; 
  20. };
  21.  
  22. struct DComplex {
  23.     double x,y;
  24. };
  25.  
  26. struct LComplex {
  27.     long x,y;
  28. };
  29.  
  30. typedef struct  DComplex         _CMPLX;
  31. typedef struct  LComplex         _LCMPLX;
  32. typedef struct  DHyperComplex    _HCMPLX;
  33. typedef struct  LHyperComplex    _LHCMPLX;
  34. #endif
  35.  
  36. #include <math.h>
  37.  
  38. #ifdef XFRACT
  39. #define far
  40. #endif
  41.  
  42.  
  43. #ifndef XFRACT
  44. struct MP {
  45.    int Exp;
  46.         unsigned long Mant;
  47. };
  48. #else
  49. struct MP {
  50.    double val;
  51. };
  52. #endif
  53.  
  54. struct MPC {
  55.         struct MP x, y;
  56. };
  57.  
  58. extern struct MP MPTrigTable[2][4][256], InvHalfPi, HalfPi, InvLn2, Ln2;
  59. extern int MPaccuracy, MPOverflow;
  60. extern int DivideOverflow;
  61.  
  62. /* Mark Peterson's expanded floating point operators.  Automatically uses
  63.    either the 8086 or 80386 processor type specified in global 'cpu'. If
  64.    the operation results in an overflow (result < 2**(2**14), or division
  65.    by zero) the global 'MPoverflow' is set to one. */
  66.  
  67. extern int cpu;
  68.  
  69. /* function pointer support added by Tim Wegner 12/07/89 */
  70. extern int         (*pMPcmp)(struct MP , struct MP );
  71. extern struct MP  *(*pMPmul)(struct MP , struct MP );
  72. extern struct MP  *(*pMPdiv)(struct MP , struct MP );
  73. extern struct MP  *(*pMPadd)(struct MP , struct MP );
  74. extern struct MP  *(*pMPsub)(struct MP , struct MP );
  75. extern struct MP  *(*pd2MP)(double )                ;
  76. extern double     *(*pMP2d)(struct MP )             ;
  77.  
  78.  
  79. /*** Formula Declarations ***/
  80. typedef enum { D_MATH, M_MATH, L_MATH } MATH_TYPE;
  81. extern MATH_TYPE MathType;
  82.  
  83. #define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y))
  84. #define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y))
  85. #define fShift(x, Shift, z) (void)((*(long*)&z) = \
  86.    RegSftFloat(*(long*)&x, Shift))
  87. #define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f))
  88. #define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f)
  89. #define fLog14(x, z) (void)((*(long*)&z) = \
  90.         RegFg2Float(LogFloat14(*(long*)&x), 16))
  91. #define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x));
  92. #define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z)
  93.  
  94. /* the following are declared 4 dimensional as an experimnent */
  95. /* changeing declarations to _CMPLX and _LCMPLX restores the code */
  96. /* to 2D */
  97. union Arg {
  98.    _CMPLX     d;
  99.    struct MPC m;
  100.    _LCMPLX    l;
  101. /*
  102.    _DHCMPLX   dh; 
  103.    _LHCMPLX   lh; */  
  104. };
  105.  
  106. struct ConstArg {
  107.    char *s;
  108.    int len;
  109.    union Arg a;
  110. };
  111.  
  112. extern union Arg *Arg1,*Arg2;
  113.  
  114. extern void lStkSin(void),lStkCos(void),lStkSinh(void),lStkCosh(void),lStkLog(void),lStkExp(void),lStkSqr(void);
  115. extern void dStkSin(void),dStkCos(void),dStkSinh(void),dStkCosh(void),dStkLog(void),dStkExp(void),dStkSqr(void);
  116.  
  117. extern void (*ltrig0)(void);
  118. extern void (*ltrig1)(void);
  119. extern void (*ltrig2)(void);
  120. extern void (*ltrig3)(void);
  121. extern void (*dtrig0)(void);
  122. extern void (*dtrig1)(void);
  123. extern void (*dtrig2)(void);
  124. extern void (*dtrig3)(void);
  125.  
  126. /* -------------------------------------------------------------------- */
  127. /*   The following #defines allow the complex transcendental functions    */
  128. /*   in parser.c to be used here thus avoiding duplicated code.     */
  129. /* -------------------------------------------------------------------- */
  130. #ifndef XFRACT
  131.  
  132. #define CMPLXmod(z)      (sqr((z).x)+sqr((z).y))
  133. #define CMPLXconj(z)    ((z).y =  -((z).y))
  134. #define LCMPLXmod(z)       (lsqr((z).x)+lsqr((z).y))
  135. #define LCMPLXconj(z)    ((z).y =  -((z).y))
  136.  
  137.  
  138. #define LCMPLXtrig0(arg,out) Arg1->l = (arg); ltrig0(); (out)=Arg1->l
  139. #define LCMPLXtrig1(arg,out) Arg1->l = (arg); ltrig1(); (out)=Arg1->l
  140. #define LCMPLXtrig2(arg,out) Arg1->l = (arg); ltrig2(); (out)=Arg1->l
  141. #define LCMPLXtrig3(arg,out) Arg1->l = (arg); ltrig3(); (out)=Arg1->l
  142.  
  143. #endif /* XFRACT */
  144.  
  145. #define  CMPLXtrig0(arg,out) Arg1->d = (arg); dtrig0(); (out)=Arg1->d
  146. #define  CMPLXtrig1(arg,out) Arg1->d = (arg); dtrig1(); (out)=Arg1->d
  147. #define  CMPLXtrig2(arg,out) Arg1->d = (arg); dtrig2(); (out)=Arg1->d
  148. #define  CMPLXtrig3(arg,out) Arg1->d = (arg); dtrig3(); (out)=Arg1->d
  149.  
  150. #ifndef XFRACT
  151.  
  152. #define LCMPLXsin(arg,out)   Arg1->l = (arg); lStkSin();  (out) = Arg1->l
  153. #define LCMPLXcos(arg,out)   Arg1->l = (arg); lStkCos();  (out) = Arg1->l
  154. #define LCMPLXsinh(arg,out)  Arg1->l = (arg); lStkSinh(); (out) = Arg1->l
  155. #define LCMPLXcosh(arg,out)  Arg1->l = (arg); lStkCosh(); (out) = Arg1->l
  156. #define LCMPLXlog(arg,out)   Arg1->l = (arg); lStkLog();  (out) = Arg1->l
  157. #define LCMPLXexp(arg,out)   Arg1->l = (arg); lStkExp();  (out) = Arg1->l
  158. /*
  159. #define LCMPLXsqr(arg,out)   Arg1->l = (arg); lStkSqr();  (out) = Arg1->l
  160. */
  161. #define LCMPLXsqr(arg,out)   \
  162.    (out).x = lsqr((arg).x) - lsqr((arg).y);\
  163.    (out).y = multiply((arg).x, (arg).y, bitshiftless1)
  164. #define LCMPLXsqr_old(out)     \
  165.    (out).y = multiply(lold.x, lold.y, bitshiftless1);\
  166.    (out).x = ltempsqrx - ltempsqry\
  167.  
  168. #define LCMPLXpwr(arg1,arg2,out)    Arg2->l = (arg1); Arg1->l = (arg2);\
  169.      lStkPwr(); Arg1++; Arg2++; (out) = Arg2->l
  170. #define LCMPLXmult(arg1,arg2,out)    Arg2->l = (arg1); Arg1->l = (arg2);\
  171.      lStkMul(); Arg1++; Arg2++; (out) = Arg2->l
  172. #define LCMPLXadd(arg1,arg2,out)    \
  173.     (out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y
  174. #define LCMPLXsub(arg1,arg2,out)    \
  175.     (out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y
  176.  
  177. #define LCMPLXtimesreal(arg,real,out)    \
  178.     (out).x = multiply((arg).x,(real),bitshift);\
  179.     (out).y = multiply((arg).y,(real),bitshift)
  180.  
  181. #define LCMPLXrecip(arg,out)    \
  182. { long denom; denom = lsqr((arg).x) + lsqr((arg).y);\
  183. if(denom==0L) overflow=1; else {(out).x = divide((arg).x,denom,bitshift);\
  184. (out).y = -divide((arg).y,denom,bitshift);}}
  185. #endif /* XFRACT */
  186.  
  187. #define CMPLXsin(arg,out)    Arg1->d = (arg); dStkSin();  (out) = Arg1->d
  188. #define CMPLXcos(arg,out)    Arg1->d = (arg); dStkCos();  (out) = Arg1->d
  189. #define CMPLXsinh(arg,out)   Arg1->d = (arg); dStkSinh(); (out) = Arg1->d
  190. #define CMPLXcosh(arg,out)   Arg1->d = (arg); dStkCosh(); (out) = Arg1->d
  191. #define CMPLXlog(arg,out)    Arg1->d = (arg); dStkLog();  (out) = Arg1->d
  192. #define CMPLXexp(arg,out)    FPUcplxexp(&(arg), &(out))
  193. /*
  194. #define CMPLXsqr(arg,out)    Arg1->d = (arg); dStkSqr();  (out) = Arg1->d
  195. */
  196. #define CMPLXsqr(arg,out)    \
  197.    (out).x = sqr((arg).x) - sqr((arg).y);\
  198.    (out).y = ((arg).x+(arg).x) * (arg).y
  199. #define CMPLXsqr_old(out)    \
  200.    (out).y = (old.x+old.x) * old.y;\
  201.    (out).x = tempsqrx - tempsqry
  202.  
  203. #define CMPLXpwr(arg1,arg2,out)   (out)= ComplexPower((arg1), (arg2))
  204. #define CMPLXmult1(arg1,arg2,out)    Arg2->d = (arg1); Arg1->d = (arg2);\
  205.      dStkMul(); Arg1++; Arg2++; (out) = Arg2->d
  206. #define CMPLXmult(arg1,arg2,out)  \
  207.     {\
  208.        _CMPLX TmP;\
  209.        TmP.x = (arg1).x*(arg2).x - (arg1).y*(arg2).y;\
  210.        TmP.y = (arg1).x*(arg2).y + (arg1).y*(arg2).x;\
  211.        (out) = TmP;\
  212.      }
  213. #define CMPLXadd(arg1,arg2,out)    \
  214.     (out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y
  215. #define CMPLXsub(arg1,arg2,out)    \
  216.     (out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y
  217. #define CMPLXtimesreal(arg,real,out)   \
  218.     (out).x = (arg).x*(real);\
  219.     (out).y = (arg).y*(real)
  220.  
  221. #define CMPLXrecip(arg,out)    \
  222.    { double denom; denom = sqr((arg).x) + sqr((arg).y);\
  223.      if(denom==0.0) {(out).x = 1.0e10;(out).y = 1.0e10;}else\
  224.     { (out).x =  (arg).x/denom;\
  225.      (out).y = -(arg).y/denom;}}
  226.  
  227. #endif
  228.